#include "tacheMiseEnCartonsImpression.h"
 
MSG_Q_ID m_idBalLots, m_idBalCartons, m_idBalErreurs;
SEM_ID m_idSemCartons, m_idSemClapet;
int nbrPiecesDefectueuses = 0;
int nbrPiecesOK = 0;
int nbrCartons = 0;
int erreur;
int taillePiece[2];
int tauxPiecesDefectueusesMax = 0;

void handlerArretUrgence(int sig)
{
	semTake(m_idSemClapet, WAIT_FOREVER);
	clapet = 0;
	semGive(m_idSemClapet);
	taskSuspend(taskIdSelf());
}


void ArriveePiece(int sig)
{ 
	float taux;
	MESSAGE_LOG_ERR message;
	
	if(taillePiece[0] != LARGEUR_PIECE_STANDARD || taillePiece[1]!= LONGUEUR_PIECE_STANDARD)
	{
		nbrPiecesDefectueuses++;
		taux = (float)nbrPiecesDefectueuses / (float)nbrPiecesOK;
		if(taux > piecesDefectueusesMax)
		{
			semTake(m_idSemClapet, WAIT_FOREVER);
			clapet = 0;
			semGive(m_idSemClapet);
			message.type = MESS_ERREUR;
			message.type_erreur = ERR_TAUX_PIECES_DEFECTUEUSES;
			msgQSend(m_idBalErreurs, (char*)&message, sizeof(MESSAGE_LOG_ERR), WAIT_FOREVER, MSG_PRI_NORMAL);
		}
	}
	else
	{
		nbrPiecesOK++;
		if(nbrPiecesOK == CAPACITE_CARTON)
		{
			semGive(m_idSemCartons);
		}
	}
}


int MiseEnCarton(MSG_Q_ID idBalLots, MSG_Q_ID idBalCartons, MSG_Q_ID idBalErreurs, SEM_ID idSemCartons, SEM_ID idSemClapet, int taillePiece[2])
{
	MESSAGE_LOT messageLot;
	MESSAGE_LOG_ERR message;
	CARTON carton;
	float tauxPiecesDefectueuses;
	
	m_idBalLots = idBalLots;
	m_idBalCartons = idBalCartons;
	m_idBalErreurs = idBalErreurs;
	m_idSemCartons = idSemCartons;
	m_idSemClapet = idSemClapet;
	
	printf("Demarrage de la tache MiseEnCartonImpression...\n");
	
	signal(SIGUSR1, handlerArretUrgence);
	signal(SIGUSR2, ArriveePiece);
	
	for(;;)
	{
		msgQReceive(m_idBalLots, (char*)&messageLot, sizeof(MESSAGE_LOT), WAIT_FOREVER);
		if(messageLot.numeroLot == -1) //on a recu un ordre de fin
		{
			carton.type = -1;
			carton.numLot = -1;	
			msgQSend(m_idBalCartons, (char*)&carton, sizeof(CARTON), WAIT_FOREVER, MSG_PRI_NORMAL); //envoi du carton TODO verifier que ca marche
			
		}
		else
		{
			piecesDefectueusesMax = messageLot.piecesDefectueusesMax;
			while (nbrCartons < CAPACITE_PALETTE) //la palette n'est pas pleine
			{
				if(etatImprimante == 0) //l'imprimante est OK
				{
					semTake(m_idSemCartons, WAIT_FOREVER); //attente d'un carton
					tauxPiecesDefectueuses = (float)nbrPiecesDefectueuses / (float)nbrPiecesOK;
					getDateCourante(&(carton.sec), &(carton.min), &(carton.h), &(carton.jour), &(carton.mois), &(carton.annee));
					carton.type = messageLot.typePieces;
					carton.numLot = messageLot.numeroLot;
					
					msgQSend(m_idBalCartons, (char*)&carton, sizeof(CARTON), WAIT_FOREVER, MSG_PRI_NORMAL); //envoi du carton TODO verifier que ca marche
					
					//envoi du message de log
					msgLog.type = LOG_NORMAL;
					sprintf(msgLog.message,"carton du lot nｰ%d envoye a la mise en palette",carton.numLot);
					msgLog.message[strlen(msgLog.message) + 1] = '\0';
					getDateCourante(&msgLog.sec, &msgLog.min, &msgLog.h, &msgLog.jour, &msgLog.mois, &msgLog.annee);
					msgQSend(idBalLogs,(char*)&msgLog,sizeof(MESSAGE_LOG_ERR),WAIT_FOREVER,MSG_PRI_NORMAL);
					
					//envoi du message d'information "cretion de la palette" ・l'IHM
					msgIhm.heures = msgLog.h;
					msgIhm.minutes = msgLog.min;
					msgIhm.secondes = msgLog.sec;
					msgIhm.type = 3;
					msgIhm.idObjet = 6;
					msgIhm.typeObjet = -1;
					strcpy(msgIhm.message,"imprime" + tauxPiecesDefectueuses);
					msgQSend(idBalIhm,(char*)&msgIhm,sizeof(MESSAGE_IHM),WAIT_FOREVER,MSG_PRI_NORMAL);
					
				}
				else //erreur d'imprimante
				{
					semTake(m_idSemClapet, WAIT_FOREVER);
					clapet = 0;
					semGive(m_idSemClapet);
					getDateCourante(&(message.sec), &(message.min), &(message.h), &(message.jour), &(message.mois), &(message.annee));
					message.type = MESS_ERREUR;
					message.type_erreur = ERR_IMPRIMANTE_EN_PANNE;
					msgQSend(m_idBalErreurs, (char*)&message, sizeof(MESSAGE_LOG_ERR), WAIT_FOREVER, MSG_PRI_NORMAL);
					taskSuspend(taskIdSelf());
				}
			}
		}
	}
	return 0;
}




